import { ecs } from "db://oops-framework/libs/ecs/ECS";
import { Equip } from "../Equip";
import { EquipModelLevelComp } from "../model/EquipModelLevelComp";
import { smc } from "../../common/ecs/SingletonModuleComp";
import { oops } from "db://oops-framework/core/Oops";
import { EquipEvent } from "../EquipEvent";
import { RoleAttributeType, RoleModuleType } from "../../role/model/RoleEnum";

/**
 * 装备升级
 */
@ecs.register('EquipUpgrade')
export class EquipUpgradeComp extends ecs.Comp {
    /** 当前等级 */
    lv: number = 0;
    /** 1: 设置默认等级 2: 升级 */
    type: number = 0;

    reset() {
        this.lv = 0;
        this.type = 0;
    }
}

export class EquipUpgradeSystem extends ecs.ComblockSystem implements ecs.IEntityEnterSystem {
    filter(): ecs.IMatcher {
        return ecs.allOf(EquipUpgradeComp, EquipModelLevelComp);
    }

    entityEnter(e: Equip): void {
        let rm = e.EquipModel;
        let ru = e.EquipUpgrade;

        if (ru.type == 2) {
            this.levelUp(e);
        } else {
            rm.level = ru.lv;             // 设置等级
            this.setAttr(e);
            e.EquipModel.role.setEquipTaozhuang();
            smc.account.checkEquipUpgrade();
            oops.message.dispatchEvent(EquipEvent.EquipLevelUp);
            e.remove(EquipUpgradeComp);
        }
    }

    private levelUp(e: Equip) {
        // 获取装备的模型等级和模型
        let rlm = e.EquipModelLevel;
        let rm = e.EquipModel;

        // 如果装备没有升级等级，则移除升级组件，并提示材料不足
        if (!rm.upgradeLevel) {
            e.remove(EquipUpgradeComp);
            return oops.gui.toast("材料不足");
        }

        // 如果装备等级大于主公等级，则移除升级组件，并提示装备等级不能大于主公等级
        if (rm.level == smc.account.AccountModel.leader.LeaderModel.level) {
            oops.gui.toast("装备等级不能大于主公等级")
            e.remove(EquipUpgradeComp);
            return
        }

        // 设置请求参数
        var params: any = {
            heroid: rm.role.RoleModel.id,
            tp: rm.table.type_e,
            lv: rm.upgradeLevel
        }

        // 设置请求完成后的回调函数
        let onComplete = {
            target: this,
            callback: (data: any) => {
                // 如果装备是进阶装备，则将装备id加4，并设置装备为套装
                if (rm.isJinjie) {
                    rm.id += 4;
                    e.EquipModel.role.setEquipTaozhuang();
                }

                // 装备等级增加升级等级
                rm.level += rm.upgradeLevel;
                // 获取消耗的精铁数量
                var spend = rm.spend;
                // 减少精铁数量
                smc.account.addItem("jingtie", -spend);
                // 设置装备属性
                this.setAttr(e);
                smc.account.checkEquipUpgrade();
                oops.message.dispatchEvent(EquipEvent.EquipLevelUp);
            }
        }
       // netChannel.game.req("eqp", "lvup", params, onComplete);
       onComplete.callback({
        data: {
            code: 0,
            msg: "success"
            }
        });

        e.remove(EquipUpgradeComp);
    }

    private setAttr(e: Equip) {
        // 获取装备模型等级
        let rlm = e.EquipModelLevel;
        // 获取装备模型
        let rm = e.EquipModel;
        // 获取角色
        let role = rm.role;

        // 初始化装备模型等级的当前配置
        rlm.confCurrent.init(rm.level);
        // 初始化装备模型颜色的当前配置
        rlm.colorConfCurrent.init(rm.color);

        // 如果装备类型为1，设置攻击属性
        if (rm.type == 1) {
            var atk = rlm.confCurrent.atk_attr[rm.type - 1];
            role.setNumericValue(RoleAttributeType.atk, RoleModuleType.Equip_1, atk);
        }

        // 如果装备类型为2，设置生命值属性
        if (rm.type == 2) {
            var hp = rlm.confCurrent.hp_attr[rm.type - 1];
            role.setNumericValue(RoleAttributeType.hp, RoleModuleType.Equip_2, hp);
        }

        // 如果装备类型为3，设置防御属性
        if (rm.type == 3) {
            var def = rlm.confCurrent.def_attr[rm.type - 1];
            role.setNumericValue(RoleAttributeType.def, RoleModuleType.Equip_3, def);
        }

        // 如果装备类型为4，设置生命值属性
        if (rm.type == 4) {
            var hp = rlm.confCurrent.hp_attr[rm.type - 1];
            role.setNumericValue(RoleAttributeType.hp, RoleModuleType.Equip_4, hp);
        }

        // 设置装备模型的攻击、生命值、防御属性
        rm.atk = atk;
        rm.hp = hp;
        rm.def = def;

        // 刷新角色战力
        e.EquipModel.role.refreshZhanli();
    }
}